
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2008, Adam Kubach
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  Class to hold lon,lat,height coordinates.
//
///////////////////////////////////////////////////////////////////////////////

#include "Minerva/Common/Coordinates.h"

using namespace Minerva::Common;


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

Coordinates::Coordinates() : BaseClass(),
  _coordinates(),
  _extents()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor.
//
///////////////////////////////////////////////////////////////////////////////

Coordinates::~Coordinates()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the iterator to the begining.
//
///////////////////////////////////////////////////////////////////////////////

Coordinates::const_iterator Coordinates::begin() const
{
  return _coordinates.begin();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the iterator to the end.
//
///////////////////////////////////////////////////////////////////////////////

Coordinates::const_iterator Coordinates::end() const
{
  return _coordinates.end();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the iterator to the begining.
//
///////////////////////////////////////////////////////////////////////////////

Coordinates::const_reverse_iterator Coordinates::rbegin() const
{
  return _coordinates.rbegin();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the iterator to the end.
//
///////////////////////////////////////////////////////////////////////////////

Coordinates::const_reverse_iterator Coordinates::rend() const
{
  return _coordinates.rend();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the i'th coordinate.
//
///////////////////////////////////////////////////////////////////////////////

const Usul::Math::Vec3d& Coordinates::at ( unsigned int i ) const
{
  return _coordinates.at ( i );
}

///////////////////////////////////////////////////////////////////////////////
//
//  Add a point.
//
///////////////////////////////////////////////////////////////////////////////

void Coordinates::addPoint ( double lon, double lat, double altitude )
{
  _coordinates.push_back ( Usul::Math::Vec3d ( lon, lat, altitude ) );
  _extents.expand ( Extents::Vertex ( lon, lat ) );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Are we empty?
//
///////////////////////////////////////////////////////////////////////////////

bool Coordinates::empty() const
{
  return _coordinates.empty();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the extents.
//
///////////////////////////////////////////////////////////////////////////////

const Coordinates::Extents& Coordinates::extents() const
{
  return _extents;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Reserve enough room.
//
///////////////////////////////////////////////////////////////////////////////

void Coordinates::reserve ( unsigned int num )
{
  _coordinates.reserve ( num );
}


///////////////////////////////////////////////////////////////////////////////
//
//  How many coordinates do we have.
//
///////////////////////////////////////////////////////////////////////////////

std::size_t Coordinates::size() const
{
  return _coordinates.size();
}
